home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 10868 / 10868.xpi / chrome / sync.jar / content / preferences / fx-prefs.js next >
Text File  |  2010-02-02  |  16KB  |  458 lines

  1. let gWeavePane = {
  2.   get _usingMainServers() {
  3.     return document.getElementById("serverType").selectedItem.value == "main";
  4.   },
  5.  
  6.   get bundle() {
  7.     delete this.bundle;
  8.     return this.bundle = document.getElementById("weavePrefStrings");
  9.   },
  10.  
  11.   get page() {
  12.     return document.getElementById("weavePrefsDeck").selectedIndex;
  13.   },
  14.  
  15.   set page(val) {
  16.     document.getElementById("weavePrefsDeck").selectedIndex = val;
  17.   },
  18.  
  19.   get prefArray() {
  20.     return ["engine.bookmarks", "engine.passwords", "engine.prefs",
  21.       "engine.tabs", "engine.history"];
  22.   },
  23.  
  24.   onLoginStart: function () {
  25.     switch (this.page) {
  26.       case "0":
  27.         document.getElementById("signInFeedbackBox").hidden = false;
  28.         break;
  29.       case "1":
  30.         let box = document.getElementById("passphraseFeedbackBox");
  31.         this._setFeedbackMessage(box, true);
  32.         box.hidden = false;
  33.         document.getElementById("passphrase-throbber").hidden = false;
  34.         break;
  35.       case "4":
  36.         document.getElementById("connect-throbber").hidden = false;
  37.         break;
  38.     }
  39.   },
  40.  
  41.   onLoginError: function () {
  42.     let errorString = Weave.Utils.getErrorString(Weave.Status.login);
  43.     let feedback = null;
  44.  
  45.     switch (this.page) {
  46.       case "0":
  47.         document.getElementById("signInFeedbackBox").hidden = true;
  48.         feedback = document.getElementById("passwordFeedbackRow");
  49.  
  50.         // Move on to the passphrase page if that's the only failure
  51.         if (Weave.Status.login == Weave.LOGIN_FAILED_INVALID_PASSPHRASE) {
  52.           this.page = 1;
  53.           return;
  54.         }
  55.         break;
  56.       case "1":
  57.         document.getElementById("passphrase-throbber").hidden = true;
  58.         switch (Weave.Status.login) {
  59.           case Weave.LOGIN_FAILED_LOGIN_REJECTED:
  60.             feedback = document.getElementById("passwordFeedbackRow");
  61.             this.page = 0;
  62.             break;
  63.           default:
  64.             feedback = document.getElementById("passphraseFeedbackBox");
  65.             document.getElementById("passphraseHelpBox").hidden = false;
  66.             break;
  67.         }
  68.         break;
  69.       case "4":
  70.         document.getElementById("connect-throbber").hidden = true;
  71.         feedback = document.getElementById("loginFeedbackRow");
  72.         this.updateWeavePrefs();
  73.         break;
  74.     }
  75.     this._setFeedbackMessage(feedback, false, errorString);
  76.   },
  77.  
  78.   onLoginFinish: function () {
  79.     document.getElementById("passphrase-throbber").hidden = true;
  80.     document.getElementById("connect-throbber").hidden = true;
  81.     document.getElementById("signInFeedbackBox").hidden = true;
  82.     Weave.Service.persistLogin();
  83.     this._setFeedbackMessage(document.getElementById("loginFeedbackRow"), true);
  84.     this._setFeedbackMessage(document.getElementById("passphraseFeedbackBox"), true);
  85.     this._setFeedbackMessage(document.getElementById("passwordFeedbackRow"), true);
  86.     document.getElementById("weaveUsername").reset();
  87.     document.getElementById("weavePassword").reset();
  88.     document.getElementById("weavePassphrase").reset();
  89.     document.getElementById("weaveServerURL").reset();
  90.     this.updateWeavePrefs();
  91.   },
  92.  
  93.   onPBModeChange: function () {
  94.     this.updateConnectButton();
  95.     this.updateSetupButtons();
  96.     this.checkFields();
  97.   },
  98.  
  99.   initWeavePrefs: function () {
  100.     let obs = [
  101.       ["weave:service:login:start",   "onLoginStart"],
  102.       ["weave:service:login:error",   "onLoginError"],
  103.       ["weave:service:login:finish",  "onLoginFinish"],
  104.       ["private-browsing",            "onPBModeChange"],
  105.       ["weave:service:logout:finish", "updateWeavePrefs"]];
  106.  
  107.     // Add the observers now and remove them on unload
  108.     let weavePrefs = this;
  109.     let addRem = function(add) obs.forEach(function([topic, func])
  110.       Weave.Svc.Obs[add ? "add" : "remove"](topic, weavePrefs[func], weavePrefs));
  111.     addRem(true);
  112.     window.addEventListener("unload", function() addRem(false), false);
  113.  
  114.     this.updateWeavePrefs();
  115.   },
  116.  
  117.   updateWeavePrefs: function () {
  118.     // The password changed or isn't saved by the app, so ask for a new one
  119.     if (Weave.Status.login == Weave.LOGIN_FAILED_LOGIN_REJECTED ||
  120.         Weave.Status.login == Weave.LOGIN_FAILED_NO_PASSWORD) {
  121.       this.page = 0;
  122.       document.getElementById("weaveUsername").value = Weave.Service.username;
  123.       document.getElementById("weavePassphrase").value = Weave.Service.passphrase || "";
  124.       document.getElementById("weaveServerURL").value = Weave.Service.serverURL;
  125.       this.onLoginError();
  126.     }
  127.     // The passphrase must have changed so ask for a new one
  128.     else if (Weave.Status.login == Weave.LOGIN_FAILED_INVALID_PASSPHRASE) {
  129.       this.page = 1;
  130.       document.getElementById("weaveUsername").value = Weave.Service.username;
  131.       document.getElementById("weavePassword").value = Weave.Service.password;
  132.       document.getElementById("weaveServerURL").value = Weave.Service.serverURL;
  133.       this.onLoginError();
  134.     }
  135.     else if (Weave.Service.username &&
  136.         Weave.Svc.Prefs.get("firstSync", "") == "notReady") {
  137.       this.page = 2;
  138.       Weave.Clients.sync();
  139.     }
  140.     else if (Weave.Service.username) {
  141.       document.getElementById("currentUser").value = Weave.Service.username;
  142.       this.page = 4;
  143.     }
  144.     else {
  145.       Weave.Svc.Prefs.set("firstSync", "notReady");
  146.       this.page = 0;
  147.     }
  148.  
  149.     this.updateConnectButton();
  150.     this.updateSetupButtons();
  151.     
  152.     let syncEverything = this._checkDefaultValues();
  153.     document.getElementById("weaveSyncMode").selectedIndex = syncEverything ? 0 : 1;
  154.     document.getElementById("syncModeOptions").selectedIndex = syncEverything ? 0 : 1;
  155.     this.checkFields();
  156.   },
  157.  
  158.   onServerChange: function () {
  159.     if (this._usingMainServers)
  160.       document.getElementById("weaveServerURL").value = "";
  161.     document.getElementById("serverRow").hidden = this._usingMainServers;
  162.     this.checkFields();
  163.   },
  164.  
  165.   updateSetupButtons: function () {
  166.     let elems = ["weaveUsername", "weaveUsernameLabel",
  167.                  "weavePassword", "weavePasswordLabel",
  168.                  "weaveServerURL", "weaveServerURLLabel",
  169.                  "signInButton", "createAccountButton", "serverType"]
  170.     let pbEnabled = Weave.Svc.Private.privateBrowsingEnabled;
  171.     for (let i = 0;i < elems.length;i++)
  172.       document.getElementById(elems[i]).disabled = pbEnabled;
  173.   },
  174.  
  175.   handleChoice: function () {
  176.     let desc = document.getElementById("mergeChoiceRadio").selectedIndex;
  177.     document.getElementById("chosenActionDeck").selectedIndex = desc;
  178.     switch (desc) {
  179.       case 1:
  180.         if (this._case1Setup)
  181.           break;
  182.  
  183.         // history
  184.         let db = Weave.Svc.History.DBConnection;
  185.  
  186.         let daysOfHistory = 0;
  187.         let stm = db.createStatement(
  188.           "SELECT ROUND(( " +
  189.             "strftime('%s','now','localtime','utc') - " +
  190.             "( " +
  191.               "SELECT visit_date FROM moz_historyvisits " +
  192.               "UNION ALL " +
  193.               "SELECT visit_date FROM moz_historyvisits_temp " +
  194.               "ORDER BY visit_date ASC LIMIT 1 " +
  195.               ")/1000000 " +
  196.             ")/86400) AS daysOfHistory ");
  197.  
  198.         if (stm.step())
  199.           daysOfHistory = stm.getInt32(0);
  200.         document.getElementById("historyCount").value =
  201.           this.bundle.getFormattedString("historyCount.label",  [daysOfHistory]);
  202.           
  203.         // bookmarks
  204.         let bookmarks = 0;
  205.         stm = db.createStatement(
  206.           "SELECT count(*) AS bookmarks " + 
  207.           "FROM moz_bookmarks b " + 
  208.           "LEFT JOIN moz_bookmarks t ON " +
  209.           "b.parent = t.id WHERE b.type = 1 AND t.parent <> :tag");
  210.         stm.params.tag = Weave.Svc.Bookmark.tagsFolder;
  211.         if (stm.executeStep())
  212.           bookmarks = stm.row.bookmarks;
  213.         document.getElementById("bookmarkCount").value =
  214.           this.bundle.getFormattedString("bookmarkCount.label", [bookmarks]);
  215.  
  216.         // passwords
  217.         let logins = Weave.Svc.Login.getAllLogins({});
  218.         document.getElementById("passwordCount").value =
  219.           this.bundle.getFormattedString("passwordCount.label",  [logins.length]);
  220.         this._case1Setup = true;
  221.         break;
  222.       case 2:
  223.         if (this._case2Setup)
  224.           break;
  225.         let count = 0;
  226.         function appendNode(label) {
  227.           let box = document.getElementById("clientList");
  228.           let node = document.createElement("label");
  229.           node.setAttribute("value", label);
  230.           node.setAttribute("class", "data indent");
  231.           box.appendChild(node);
  232.         }
  233.         let prevName = "";
  234.         for each (let {name} in Weave.Clients.getClients()) {
  235.           if (name != prevName) {
  236.             count++;
  237.             if (count < 5)
  238.               appendNode(name);
  239.           }
  240.           prevName = name;
  241.         }
  242.         if (count > 5) {
  243.           let label = 
  244.             this.bundle.getFormattedString("additionalClients.label", [count - 5]);
  245.           appendNode(label);
  246.         }
  247.         this._case2Setup = true;
  248.         break; 
  249.     }
  250.  
  251.     this.page = 3;
  252.   },
  253.  
  254.   updateConnectButton: function () {
  255.     let str = Weave.Service.isLoggedIn ? this.bundle.getString("disconnect.label")
  256.                                        : this.bundle.getString("connect.label");
  257.     document.getElementById("connectButton").label = str;
  258.     let notReady = Weave.Status.service == Weave.STATUS_DELAYED ? true : false;
  259.     let pbEnabled = Weave.Svc.Private.privateBrowsingEnabled;
  260.     document.getElementById("connectButton").disabled = notReady || pbEnabled;
  261.   },
  262.  
  263.   handleConnectCommand: function () {
  264.     Weave.Service.isLoggedIn ? Weave.Service.logout() : Weave.Service.login();
  265.   },
  266.  
  267.   startOver: function () {
  268.     this.handleExpanderClick();
  269.     Weave.Service.logout();
  270.     Weave.Svc.Prefs.resetBranch("");
  271.     this.updateWeavePrefs();
  272.     document.getElementById("manageAccountExpander").className = "expander-down";
  273.     document.getElementById("manageAccountControls").hidden = true;
  274.   },
  275.  
  276.   recoverPassword: function () {
  277.     openUILinkIn(Weave.Svc.Prefs.get("pwChangeURL"), "tab");
  278.     return; // xxx: FIXME EWTF_PASSWORD_REQUEST_API_CHANGED
  279.     let ok = Weave.Service.requestPasswordReset(Weave.Service.username);
  280.     if (ok) { // xxxmpc: FIXME
  281.       Weave.Svc.Prompt.alert(window,
  282.                              this.bundle.getString("recoverPasswordSuccess.title"),
  283.                              this.bundle.getString("recoverPasswordSuccess.label"));
  284.     }
  285.     else {
  286.       // this should never ever get hit, so shouldn't get localized
  287.       alert("Account name not on record, maybe it was deleted? EWTF_NO_ACCOUNT");
  288.     }
  289.   },
  290.  
  291.   changePassword: function () {
  292.     Weave.Utils.openGenericDialog("ChangePassword");
  293.   },
  294.  
  295.   changePassphrase: function () {
  296.     Weave.Utils.openGenericDialog("ChangePassphrase");
  297.   },
  298.  
  299.   resetPassphrase: function () {
  300.     Weave.Utils.openGenericDialog("ResetPassphrase");
  301.   },
  302.  
  303.   updateSyncPrefs: function () {
  304.     let syncEverything = document.getElementById("weaveSyncMode").selectedItem.value == "syncEverything";
  305.     document.getElementById("syncModeOptions").selectedIndex = syncEverything ? 0 : 1;
  306.  
  307.     if (syncEverything) {
  308.       let prefs = this.prefArray;
  309.       for (let i = 0; i < prefs.length; ++i)
  310.         document.getElementById(prefs[i]).value = true;
  311.     }
  312.   },
  313.  
  314.   /**
  315.    * Check whether all the preferences values are set to their default values
  316.    *
  317.    * @param aPrefs an array of pref names to check for
  318.    * @returns boolean true if all of the prefs are set to their default values,
  319.    *                  false otherwise
  320.    */
  321.   _checkDefaultValues: function () {
  322.     let prefs = this.prefArray;
  323.     for (let i = 0; i < prefs.length; ++i) {
  324.       let pref = document.getElementById(prefs[i]);
  325.       if (pref.value != pref.defaultValue)
  326.         return false;
  327.     }
  328.     return true;
  329.   },
  330.  
  331.  
  332.   handleExpanderClick: function () {
  333.     // ok, this is pretty evil, and likely fragile if the prefwindow
  334.     // binding changes, but that won't happen in 3.6 *fingers crossed*
  335.     let prefwindow = document.documentElement;
  336.     let pane = document.getElementById("paneWeaveServices");
  337.     if (prefwindow._shouldAnimate)
  338.       prefwindow._currentHeight = pane.contentHeight;
  339.  
  340.     let expander = document.getElementById("manageAccountExpander");
  341.     let expand = expander.className == "expander-down";
  342.     expander.className =
  343.        expand ? "expander-up" : "expander-down";
  344.     document.getElementById("manageAccountControls").hidden = !expand;
  345.  
  346.     // and... shazam
  347.     if (prefwindow._shouldAnimate)
  348.       prefwindow.animate("null", pane);
  349.   },
  350.  
  351.   goBack: function () {
  352.     this.page -= 1;
  353.   },
  354.  
  355.   doSignIn: function () {
  356.     Weave.Service.username = document.getElementById("weaveUsername").value;
  357.     Weave.Service.password = document.getElementById("weavePassword").value;
  358.     Weave.Service.passphrase = document.getElementById("weavePassphrase").value;
  359.     let serverURI =
  360.       Weave.Utils.makeURI(document.getElementById("weaveServerURL").value);
  361.     if (serverURI)
  362.       Weave.Service.serverURL = serverURI.spec;
  363.     else
  364.       Weave.Svc.Prefs.reset("serverURL");
  365.  
  366.     Weave.Service.login();
  367.   },
  368.  
  369.   setupInitialSync: function (syncChoice) {
  370.     switch (syncChoice) {
  371.       case "wipeRemote":
  372.       case "wipeClient":
  373.         Weave.Svc.Prefs.set("firstSync", syncChoice);
  374.         break;
  375.       case "merge":
  376.         Weave.Svc.Prefs.reset("firstSync");
  377.         break;
  378.     }
  379.     Weave.Service.syncOnIdle(1); // shorter delay than normal
  380.     window.close();
  381.   },
  382.  
  383.   startAccountSetup: function () {
  384.     var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
  385.                        .getService(Components.interfaces.nsIWindowMediator);
  386.     var win = wm.getMostRecentWindow("Weave:AccountSetup");
  387.     if (win)
  388.       win.focus();
  389.     else {
  390.       window.openDialog("chrome://weave/content/preferences/fx-setup.xul",
  391.                         "migration", "centerscreen,chrome,resizable=no");
  392.     }
  393.   },
  394.  
  395.   isReady: function () {
  396.     let ready = false;
  397.     switch (this.page) {
  398.       case "0":
  399.         let hasUser = document.getElementById("weaveUsername").value != "";
  400.         let hasPass = document.getElementById("weavePassword").value != "";
  401.         if (hasUser && hasPass) {
  402.           if (this._usingMainServers)
  403.             return true;
  404.  
  405.           let uri = Weave.Utils.makeURI(document.getElementById("weaveServerURL").value);
  406.           if (uri &&
  407.               (uri.schemeIs("http") || uri.schemeIs("https")) &&
  408.               uri.host != "")
  409.             ready = true;
  410.         }
  411.         break;
  412.       case "1":
  413.         if (document.getElementById("weavePassphrase").value != "")
  414.           ready = true;
  415.         break;
  416.     }
  417.  
  418.     return ready;
  419.   },
  420.  
  421.   checkFields: function () {
  422.     switch (this.page) {
  423.       case "0":
  424.         document.getElementById("signInButton").setAttribute("disabled", !this.isReady());
  425.         break;
  426.       case "1":
  427.         document.getElementById("continueButton").setAttribute("disabled", !this.isReady());
  428.         break;
  429.     }
  430.   },
  431.  
  432.   handleKeypress: function (event) {
  433.     this.checkFields();
  434.     if (event.keyCode != Components.interfaces.nsIDOMKeyEvent.DOM_VK_RETURN)
  435.       return true;
  436.  
  437.     event.preventDefault();
  438.     if (this.isReady()) {
  439.       this.doSignIn();
  440.     }
  441.  
  442.     return false;
  443.   },
  444.  
  445.   // sets class and string on a feedback element
  446.   // if no property string is passed in, we clear label/style
  447.   _setFeedbackMessage: function (element, success, string) {
  448.     element.hidden = success;
  449.     let label = element.firstChild.nextSibling;
  450.     let classname = "";
  451.     if (string) {
  452.       classname = success ? "success" : "error";
  453.     }
  454.     label.value = string || "";
  455.     label.className = classname;
  456.   }
  457. }
  458.